文档

访问Hive数据源

更新时间:

AnalyticDB MySQL湖仓版(3.0)支持访问Hive数据源。本文以E-MapReduce集群的Hive服务为例,介绍使访问Hive数据的方法。

前提条件

  • 已创建AnalyticDB MySQL湖仓版(3.0)集群。具体操作,请参见创建湖仓版(3.0)集群

  • 已创建数据库账号。

  • 已创建Job型资源组。具体操作,请参见新建资源组

  • 已创建与AnalyticDB MySQL湖仓版(3.0)集群同地域的E-MapReduce集群。E-MapReduce集群业务场景为新增数据湖,需具有Hadoop-Common、HDFS、YARN和Hive服务,且元数据为自建 RDS内置 MySQL。具体操作,请参见创建集群。或已自建与AnalyticDB MySQL湖仓版(3.0)集群同地域的Hive集群。

    重要

    元数据类型为DLF 统一元数据的集群暂不支持使用AnalyticDB MySQL湖仓版(3.0)Spark通过ENI网络访问Hive数据。

  • 已开通OSS服务并创建存储空间。具体操作,请参见开通OSS服务创建存储空间

操作步骤

  1. 下载AnalyticDB MySQL Spark访问Hive依赖的Jar包。下载链接,请参见mysql-connector-java.jar

  2. (条件必选)如果服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,请登录集群的Master节点,在/opt/apps/HIVE/hive-current/lib路径中,下载所有的Jar包。如何登录集群的Master节点,请参见登录集群

  3. 编写访问Hive的示例程序(即Spark作业依赖的Jar包),并进行编译打包。本文生成的Jar包名称为hive_test.jar。示例代码如下:

    package com.aliyun.spark
    
    import org.apache.spark.sql.SparkSession
    
    object SparkHive {
     def main(args: Array[String]): Unit = {
     val sparkSession = SparkSession
     .builder()
     .appName("Spark HIVE TEST")
     .enableHiveSupport()
     .getOrCreate()
    
     val welcome = "hello, adb-spark"
    
     //Hive表名。
     val tableName = args(0)
    
     import sparkSession.implicits._
     //将只有一行一列数据的DataFrame: df存入Hive, 表名为用户传进来的tableName, 列名为welcome_col。
     val df = Seq(welcome).toDF("welcome_col")
     df.write.format("hive").mode("overwrite").saveAsTable(tableName)
    
     //从Hive中读取表tableName。
     val dfFromHive = sparkSession.sql(
     s"""
     |select * from $tableName
     |""".stripMargin)
     dfFromHive.show(10)
     }
    }
  4. 将步骤1~3中Spark作业依赖的Jar包上传至OSS中。具体操作,请参见简单上传

  5. 登录云原生数据仓库AnalyticDB MySQL控制台,在页面左上角,选择集群所在地域。在左侧导航栏,单击集群列表,在湖仓版(3.0)页签下,单击目标集群ID。在左侧导航栏,单击作业开发>Spark Jar开发

  6. 在编辑器窗口上方,选择Job型资源组和Batch作业类型。

  7. 编写Spark作业。

    支持通过不同协议方式连接Hive Metastore或RDS元数据库。

    通过Thrift协议连接Hive Metastore

    {
      "args": [
        "hello_adb"
      ],
      "jars": [
        # AnalyticDB MySQL Spark访问Hive依赖的Jar包。
       "oss://<bucket_name>/mysql-connector-java.jar",
        # 服务端Hive依赖的Jar包。
       "oss://<bucket_name>/hive_lib/*" 
      ],
      "file": "oss://<bucket_name>/hive_test.jar" ,
      "name": "spark-on-hive",
      "className": "com.aliyun.spark.SparkHive",
      "conf": {
      	"spark.adb.eni.enabled": "true",
        "spark.adb.eni.adbHostAlias.enabled": "true",
        "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****",    
        "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****",
        "spark.driver.resourceSpec": "medium",
        "spark.executor.instances": 1,
        "spark.executor.resourceSpec": "medium",
        "spark.hadoop.hive.metastore.uris":"thrift://master-1-1.c-9c9b32****.cn-hangzhou.emr.aliyuncs.com:9083",
        "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", 
         # 仅E-MapReduce集群为高可用集群时,需配置以下参数。
        "spark.hadoop.dfs.nameservices":"<dfs.nameservices名称>",
        "spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
        "spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>":"<namenode名称>",
        "spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<NameNode名称>":"master-1-1.c-9c9b322****.cn-hangzhou.emr.aliyuncs.com:9000",
         # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
        "spark.sql.hive.metastore.jars": "path",
        "spark.sql.hive.metastore.version": "<实际的Hive版本>",
        "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar"
      }
    }
    说明

    表格中的参数是否必填仅针对本文档的操作场景。

    参数

    是否必填

    说明

    args

    请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。

    name

    Spark作业名称。

    className

    Java或者Scala程序入口类名称。Python不需要指定入口类。

    jars

    Spark作业依赖的Jar包所在的OSS路径。

    file

    示例程序hive_test.jar所在的OSS路径。

    spark.adb.eni.enabled

    开启ENI访问的开关。配置为true表示开启ENI访问。

    spark.adb.eni.adbHostAlias.enabled

    开启Spark解析Hive表位置域名信息的开关,需要配置为true。

    spark.adb.eni.vswitchId

    E-MapReduce集群所在专有网络的交换机ID。

    登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。

    spark.adb.eni.securityGroupId

    安全组ID。在目标E-MapReduce集群基础信息页面获取安全组ID。

    spark.adb.eni.extraHosts

    Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。

    • 获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。

    • 获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。

    说明
    • 当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。

    • IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。

    spark.hadoop.hive.metastore.uris

    配置访问Hive Metastore的URI。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hive.metastore.uris对应的配置值。

    spark.hadoop.dfs.nameservices

    HDFS服务的名称。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.nameservices对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>

    指定Client连接NameNode的Provider。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.client.failover.proxy.provider.<nameservices名称>对应的配置值。默认值为org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>

    NameNode的名称。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看hdfs-site.xml中的dfs.ha.namenodes.<dfs.nameservices名称>对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>

    指定NameNode的RPC地址信息。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.sql.hive.metastore.jars

    固定取值为path

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.version

    服务端Hive版本号。

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.jars.path

    固定取值为/tmp/*/*.jar

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    conf其他参数

    与开源Spark中的配置项基本一致,参数格式为key:value形式,多个参数之间以英文逗号(,)分隔。更多conf参数,请参见Conf配置参数

    通过JDBC协议连接RDS元数据库

    {
      "args": [
        "hello_adb"
      ],
      "name": "spark-on-hive",
      "className": "com.aliyun.spark.SparkHive", 
      "jars": [
        # AnalyticDB MySQL Spark访问Hive依赖的Jar包。
        "oss://<bucket_name>/mysql-connector-java.jar",
        # 服务端Hive依赖的Jar包。
        "oss://<bucket_name>/hive_lib/*" 
      ],
       "file": "oss://<bucket_name>/hive_test.jar" ,
      "conf": {
      	"spark.adb.eni.enabled": "true",
        "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****",    
        "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****",
        "spark.adb.eni.adbHostAlias.enabled": "true",
        "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", 
        "spark.driver.resourceSpec": "medium",
        "spark.executor.instances": 1,
        "spark.executor.resourceSpec": "medium",
        "spark.sql.catalogImplementation": "hive",
        "spark.hadoop.javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
        "spark.hadoop.javax.jdo.option.ConnectionUserName": "<hive_username>",
        "spark.hadoop.javax.jdo.option.ConnectionPassword": "<hive_password>",
        "spark.hadoop.javax.jdo.option.ConnectionURL": "jdbc:mysql://rm-bp1h5d11r8qtm****.mysql.rds.aliyuncs.com/<数据库名称>", 
        # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
        "spark.sql.hive.metastore.jars": "path",
        "spark.sql.hive.metastore.version": "<实际的Hive版本>",
        "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar"
      }
    }
    说明

    表格中的参数是否必填仅针对本文档的操作场景。

    参数

    是否必填

    说明

    args

    请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。

    name

    Spark作业名称。

    className

    Java或者Scala程序入口类名称。Python不需要指定入口类。

    jars

    Spark作业依赖的Jar包所在的OSS路径。

    file

    示例程序hive_test.jar所在的OSS路径。

    spark.adb.eni.enabled

    开启ENI访问的开关。配置为true表示开启ENI访问。

    spark.adb.eni.vswitchId

    E-MapReduce集群所在专有网络的交换机ID。

    登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。

    spark.adb.eni.securityGroupId

    安全组ID。

    在目标Hive集群基础信息页面获取安全组ID。

    spark.adb.eni.adbHostAlias.enabled

    开启Spark解析Hive表位置域名信息的开关,需要配置为true。

    spark.adb.eni.extraHosts

    Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。

    • 获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。

    • 获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。

    说明
    • 当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。

    • IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。

    spark.hadoop.javax.jdo.option.ConnectionDriverName

    连接驱动程序名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionDriverName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionUserName

    自建RDS或内置MySQL数据库账号名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionUserName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionPassword

    数据库账号对应的密码。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionPassword对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionURL

    数据库访问地址和库名。

    填写格式为jdbc:mysql://rm-xxxxxx.mysql.rds.aliyuncs.com/<数据库名称>

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionURL对应的配置值。

    spark.sql.hive.metastore.jars

    固定取值为path

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.version

    服务端Hive版本号。

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.jars.path

    固定取值为/tmp/*/*.jar

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    conf其他参数

    与开源Spark中的配置项基本一致,参数格式为key:value形式,多个参数之间以英文逗号(,)分隔。更多conf参数,请参见Conf配置参数

  8. 单击立即执行

  • 本页导读 (1)
文档反馈